package Persistencia.daos;

import Persistencia.CRUD;
import Persistencia.DAO;
import Persistencia.SeqHelper;
import Persistencia.modelos.Estadio;
import Persistencia.modelos.Time;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class EstadioDAO implements DAO<Integer, Estadio> {

    @Override
    public void salva(Estadio obj) {    
        int i = SeqHelper.getId("estadio");
        String campos = "idEstadio, NomeEstadio, endereco, DataFundacaoEst,CapacidadePessoas, idtime";
        String valores = i+ ", ";
        valores += (obj.getNomeEstadio()!=null)?"'"+obj.getNomeEstadio()+"', ":"null, ";
        valores += (obj.getEndereco()!=null)?"'"+obj.getEndereco()+"', ":"null, ";
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");        
        valores += (obj.getDataFundacaoEst()!=null)?"'"+sdf.format(obj.getDataFundacaoEst())+"', ":"null, ";
        valores += (obj.getCapacidadePessoas()!=null)?obj.getCapacidadePessoas()+", ":"null, ";
        valores += (obj.getTime()!=null)? obj.getTime().getIdTime()+" ":"null ";        
        CRUD.adiciona("Estadio", campos, valores);
        obj.setIdEstadio(i);
    }

    public void atualiza(Estadio obj) {
         List<String> c = new ArrayList<String> ();        
         c.add("NomeEstadio");
         c.add("endereco");
         c.add("DataFundacaoEst");
         c.add("CapacidadePessoas");
         c.add("idtime");
         List<String> a = new ArrayList<String>();
         a.add((obj.getNomeEstadio()!=null)?"'"+obj.getNomeEstadio()+"' ":"null ");
        a.add((obj.getEndereco()!=null)?"'" + obj.getEndereco()+"' ":"null ");
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");        
        a.add((obj.getDataFundacaoEst()!=null)?"'"+sdf.format(obj.getDataFundacaoEst())+"' ":"null ");
        a.add((obj.getCapacidadePessoas()!=null)?String.valueOf(obj.getCapacidadePessoas()):"null ");
        a.add((obj.getTime()!=null)?obj.getTime().getIdTime()+" ":"null ");  
        CRUD.atualiza("estadio", c, a, "where idestadio = " + obj.getIdEstadio());
    }

    public void deleta(Integer obj) {
        List<Integer> l = new ArrayList<Integer>();
        l.add(obj);
        CRUD.deleta("estadio","idestadio", l);
    }

    public Estadio recupera(Integer obj) {
        try {
            Collection<Estadio> estadios = new ArrayList<Estadio>();               
            ResultSet rs = CRUD.consulta("select * from estadio where idestadio = " + obj);        
            rs.next();
            Estadio a = new Estadio();
            a.setIdEstadio(rs.getInt("idestadio"));
            a.setNomeEstadio(rs.getString("nomeestadio"));
            a.setDataFundacaoEst(rs.getDate("datafundacaoest"));
            a.setEndereco(rs.getString("endereco"));
            int i = rs.getInt("idTime");
            DAO<Integer, Time> dao = new TimeDAO();
            a.setTime(dao.recupera(i));
            return a;
        } catch (SQLException ex) {
            throw  new RuntimeException(ex);
        }
    }

    public Collection<Estadio> recuperaLista(Collection<Integer> chaves) {
        try {
            StringBuilder sb = new StringBuilder();
            Iterator<Integer> it = chaves.iterator();
            while (it.hasNext()){
                sb.append(it.next()).append(",");
            }
            String ids = sb.toString().substring(0, sb.toString().length()-1);
                        
            Collection<Estadio> estadios = new ArrayList<Estadio>();    
            Collection<Integer> chaves2 = new ArrayList<Integer>();
            ResultSet rs = CRUD.consulta("select * from estadio where idestadio in (" + ids + ")");                        
            while (rs.next()){
                Estadio a = new Estadio();
                a.setIdEstadio(rs.getInt("idestadio"));
                a.setNomeEstadio(rs.getString("nomeestadio"));
                a.setDataFundacaoEst(rs.getDate("datafundacaoest"));
                a.setEndereco(rs.getString("endereco"));
                int i = rs.getInt("idtime");
                chaves2.add(i);
                a.setIdTime(i);
                estadios.add(a);
            }
            DAO<Integer, Time> dao = new TimeDAO();
            Collection<Time> times = dao.recuperaLista(chaves2);
            for (Time time : times) {
                for (Iterator<Estadio> it1 = estadios.iterator(); it1.hasNext();) {
                    Estadio estadio = it1.next();
                    if (estadio.getIdTime() == time.getIdTime()){
                        estadio.setTime(time);
                        break;
                    }                    
                }
            }            
            return estadios;
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }        
    }

    public Collection<Estadio> recuperaTodos() {
        try {           
            Collection<Estadio> estadios = new ArrayList<Estadio>();    
            Collection<Integer> chaves2 = new ArrayList<Integer>();
            ResultSet rs = CRUD.consulta("select * from estadio");                        
            while (rs.next()){
                Estadio a = new Estadio();
                a.setIdEstadio(rs.getInt("IDESTADIO"));
                a.setNomeEstadio(rs.getString("NOMEESTADIO"));
                a.setDataFundacaoEst(rs.getDate("DATAFUNDACAOEST"));
                a.setCapacidadePessoas(rs.getInt("CAPACIDADEPESSOAS"));
                int i = rs.getInt("idtime");
                a.setEndereco(rs.getString("ENDERECO"));;
                chaves2.add(i);
                a.setIdTime(i);
                estadios.add(a);
            }
            DAO<Integer, Time> dao = new TimeDAO();
            Collection<Time> times = dao.recuperaLista(chaves2);
            for (Time time : times) {
                for (Iterator<Estadio> it1 = estadios.iterator(); it1.hasNext();) {
                    Estadio estadio = it1.next();
                    if (estadio.getIdTime() == time.getIdTime()){
                        estadio.setTime(time);
                        break;
                    }                    
                }
            }            
            return estadios;
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }        
    }
    
}
